import { useToast } from 'primevue/usetoast';

/**
 * 统一错误处理类
 */
export class ErrorHandler {
    constructor() {
        this._toast = null;
        this._isVueContext = false; // 默认不是Vue上下文
    }

    /**
     * 延迟初始化 Toast 实例
     */
    get toast() {
        // 检查是否在 Vue 上下文中
        try {
            if (!this._toast && !this._isVueContext) {
                // 尝试调用useToast来检测是否在Vue上下文中
                this._toast = useToast();
                this._isVueContext = true; // 成功调用说明在Vue上下文中
            } else if (this._isVueContext && !this._toast) {
                // 在Vue上下文中但还没有获取到toast实例
                this._toast = useToast();
            }
            return this._toast;
        } catch (e) {
            // 如果无法获取 Toast 实例，标记为非Vue上下文
            if (this._isVueContext) {
                console.warn('PrimeVue Toast 服务不可用:', e.message);
            }
            this._isVueContext = false;
            return null;
        }
    }

    /**
     * 处理API错误响应
     * @param {Object} result - API响应结果
     * @param {string} defaultMessage - 默认错误消息
     */
    handleApiError(result, defaultMessage = '操作失败') {
        const message = result?.Title || result?.message || defaultMessage;

        this.showError(message);

        // 记录错误日志
        this.logError('API Error', {
            message: result?.message,
            code: result?.code,
            data: result?.data
        });
    }

    /**
     * 处理网络错误
     * @param {Error} error - 网络错误对象
     * @param {string} context - 错误上下文
     */
    handleNetworkError(error, context = '') {
        const message = `网络请求失败${context ? ': ' + context : ''}`;
        this.showError(message);

        this.logError('Network Error', {
            error: error.message,
            context,
            timestamp: new Date().toISOString()
        });
    }

    /**
     * 处理验证错误
     * @param {Object} errors - 验证错误对象
     */
    handleValidationError(errors) {
        const errorMessages = Object.values(errors).flat();
        const message = errorMessages.length > 0 ? errorMessages[0] : '输入数据无效';
        this.showError(message);
    }

    /**
     * 显示错误提示
     * @param {string} message - 错误消息
     * @param {number} life - 显示时长(毫秒)
     */
    showError(message, life = 3000) {
        if (this._isVueContext && this.toast) {
            this.toast.add({
                severity: 'error',
                summary: '错误',
                detail: message,
                life: life
            });
        } else {
            alert(message);
        }
    }

    /**
     * 显示成功提示
     * @param {string} message - 成功消息
     * @param {number} life - 显示时长(毫秒)
     */
    showSuccess(message, life = 3000) {
        if (this._isVueContext && this.toast) {
            this.toast.add({
                severity: 'success',
                summary: '成功',
                detail: message,
                life: life
            });
        } else {
            console.log(`[成功] ${message}`);
        }
    }

    /**
     * 显示警告提示
     * @param {string} message - 警告消息
     * @param {number} life - 显示时长(毫秒)
     */
    showWarning(message, life = 3000) {
        if (this._isVueContext && this.toast) {
            this.toast.add({
                severity: 'warn',
                summary: '警告',
                detail: message,
                life: life
            });
        } else {
            console.warn(`[警告] ${message}`);
        }
    }

    /**
     * 显示信息提示
     * @param {string} message - 信息消息
     * @param {number} life - 显示时长(毫秒)
     */
    showInfo(message, life = 3000) {
        if (this._isVueContext && this.toast) {
            this.toast.add({
                severity: 'info',
                summary: '信息',
                detail: message,
                life: life
            });
        } else {
            console.info(`[信息] ${message}`);
        }
    }

    /**
     * 记录错误日志
     * @param {string} type - 错误类型
     * @param {Object} details - 错误详情
     */
    logError(type, details) {
        if (process.env.NODE_ENV === 'development') {
            console.error(`[${type}]`, details);
        }

        // 在生产环境中，可以将错误发送到日志服务
        // 例如: sendToLogService(type, details);
    }
}

/**
 * 创建全局错误处理器实例
 */
export function useErrorHandler() {
    return new ErrorHandler();
}

/**
 * API响应状态码常量
 */
export const API_CODES = {
    SUCCESS: 1000,
    UNAUTHORIZED: 401,
    FORBIDDEN: 403,
    NOT_FOUND: 404,
    SERVER_ERROR: 500,
    VALIDATION_ERROR: 422,
    TOKEN_EXPIRED: 1002
};

/**
 * 检查API响应是否成功
 * @param {Object} result - API响应结果
 * @returns {boolean}
 */
export function isApiSuccess(result) {
    return result && result.Code === API_CODES.SUCCESS;
}
